SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[paChequearBajasDeServiciosBK06052008]
-- <DESCRIPCION> Realiza el chequeo de baja de un servicio.
-- <CONSIDERACIONES ESPECIALES> 
-- <TABLAS> tb_ServiciosAgentes, tb_SubServiciosAgentes, tb_ColaDeMovimientos, tb_PlazasDeMovimiento
-- <ACTUALIZACIONES> 09 - 05 - 2006 por OTERO, Javier (se agrega el control de evaluacion de la antiguedad o posterioridad del movimiento)
-- <ACTUALIZACIONES> 10 - 05 - 2006 por SANES, Jorge (Se cambio Orden de Controles por Error Retornado)
-- <ACTUALIZACIONES> 23 - 05 - 2006 por SANES, Jorge (Se cambio Mensaje de Aviso cuando la Fecha de Baja es menor a la Fecha de Alta del Ultimo Subservicio)
-- <ACTUALIZACIONES> 24 - 06 - 2006 por OTERO, Javier (Se agrega control para no permitir bajar un servicio Extra Sistema de una LE.)

---- ACTUALIZADO EN DB
-- 17/07/2006 - SANES, Jorge 


@idCola INT,
@Estado INT OUTPUT,
@Diagnostico VARCHAR(1000) OUTPUT
AS
SET NOCOUNT ON
SET DATEFORMAT DMY
-- Almacena el codigo de plaza.
DECLARE @idPlaza INT
-- Almacena el Ultimo Subservicio del servicio que se va a bajar
DECLARE @SubServicio INT
-- Almacena la Fecha de Alta del ultimo Subservicio
DECLARE @FechaAlta DATETIME
-- Almacena la Fecha de Baja de la Cola de Movimientos
DECLARE @FechaBaja DATETIME
-- Almacena la plaza destino cuando es baja por Disponibilidad
DECLARE @PlazaDisponibilidad INT
--declare @Estado int
DECLARE @CausaBaja INT
-- Para almacenar el modo del usuario.
DECLARE @Modo INT
-- Para evaluar la antiguedad o posterioridad del movimiento
DECLARE @DiasAnterioresBaja INT
-- Para evaluar la antiguedad o posterioridad del movimiento
DECLARE @DiasPosterioresBaja INT
-- Para almacenar el Id de Servicio
DECLARE @IdServicio INT

SELECT @Modo = Modo FROM tb_Usuarios WHERE NTUser = SYSTEM_USER

SELECT @idPlaza = idPlaza, @SubServicio = Servicio, @PlazaDisponibilidad = PlazaDestino, @CausaBaja = CausaBaja FROM tb_PlazasDeMovimiento WHERE idCola = @idCola
SELECT @FechaAlta = FechaAlta, @IdServicio = ServicioAgente from tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio
SELECT @FechaBaja = Fecha2 from tb_ColaDeMovimientos WHERE idCola = @idCola

SELECT @DiasPosterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaPosterior'
SELECT @DiasAnterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaAnteriores'

--declare @Diagnostico varchar(1000)
DECLARE @error INT
SELECT @Diagnostico = ' '
SELECT @error = 0

-- Controla que no se pueda bajar un Servicio Extra Sistema de una Licencia Extraordinaria (Agregado el 25-06-2006)
IF EXISTS(SELECT top 1 IdServicio2 FROM tb_RelInterServicios R 
	INNER JOIN tb_ServiciosAgentes S ON S.IdServicioAgente = R.IdServicio2
	INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
	INNER JOIN tb_ServiciosAgentes SE ON SE.IdServicioAgente = R.IdServicio
	INNER JOIN tb_SubServiciosAgentes SSE ON SSE.ServicioAgente = SE.IdServicioAgente
	WHERE R.IdServicio = @IdServicio
	AND TipoRelacion = 8
	AND SS.FechaBaja IS NULL
	AND SS.SituacionLaboral = 1
	AND SSE.SituacionExtraordinaria <> 5) -- Que la situacion extraodrinaria del extrasistema NO SEA  NORMAL.
BEGIN
	SELECT @Error = 3, @Diagnostico = 'Error! No se puede bajar un servicio Extra Sistema. Para hacerlo debe dar de baja la LE.'
END

-- Control que el movimiento no este alejado del dia de la fecha.
IF  @FechaBaja < GETDATE() AND (DATEDIFF(DAY, @FechaBaja, GETDATE())+1) > @DiasAnterioresBaja
	SELECT @Error = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos anteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresBaja)+' dias de diferencia).'
ELSE
	IF @FechaBaja IS NOT NULL AND @FechaBaja > GETDATE() AND (DATEDIFF(DAY, GETDATE(), @FechaBaja)+1) > @DiasPosterioresBaja
		SELECT @Error = 1, @Diagnostico = 'Error! La fecha de baja exede la cantidad de dias permitidos posteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresBaja)+' dias de diferencia).'


IF @PlazaDisponibilidad IS NULL AND @CausaBaja = 8
BEGIN
  SELECT @Error = 3, @Diagnostico=@Diagnostico+'*'+'Cuando la causa de baja es PASE A DISPONIBILIDAD debe seleccioar una PLAZA DESTINO con division = N'
END

IF @FechaBaja <= @FechaAlta 
BEGIN
 --Se actualiza el estado en CHECK NO OK
 --update tb_PlazasDeMovimiento set estado = 3 where idCola = @idCola
 --Select @Estado = 3
 SELECT  @Diagnostico = @Diagnostico+'*'+'La Fecha de Baja es inferior a la Fecha de Alta del Ultimo SubServicio!...'
 SELECT @error = 3
END

IF @PlazaDisponibilidad is not null and @CausaBaja = 8 and ltrim(rtrim((Select d.division from tb_Divisiones d, tb_Plazas p where idDivision = p.division and idPlaza = @PlazaDisponibilidad))) <> 'N'
BEGIN
   SELECT @Error = 3, @Diagnostico=@Diagnostico+'*'+'La Division de la Plaza Destino debe tener division = N.  Si no existe la plaza deberia crearla'	
END

IF EXISTS(SELECT top 1 S.FechaBaja FROM tb_ServiciosAgentes S INNER JOIN tb_SubServiciosAgentes SS ON idServicioagente = ServicioAgente WHERE idSubServicio = @SubServicio AND S.FechaBaja IS NOT NULL)
BEGIN
	SELECT @Error =3, @Diagnostico=@Diagnostico+'*'+'El Servicio ya se encuentra dado de baja'
END

--se actualiza el estado en CHECK OK
UPDATE tb_PlazasDeMovimiento SET Estado = @error WHERE idCola = @idCola
UPDATE tb_ColaDeMovimientos SET Estado = @Error, estadocheck = @error,
ChequeoEscuela = CASE WHEN @Modo = 2 THEN @Diagnostico ELSE ChequeoEscuela END
 WHERE idCola = @idCola

SET @Estado = @Error
GO
